package co.edu.javeriana.konigsberg.xavier.gui.bean;


import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;

import co.edu.javeriana.konigsberg.xavier.dto.DepartamentoDTO;
import co.edu.javeriana.konigsberg.xavier.dto.PaisDTO;
import co.edu.javeriana.konigsberg.xavier.dto.UsuarioDTO;
import co.edu.javeriana.konigsberg.xavier.servicio.CiudadServicioLocal;
import co.edu.javeriana.konigsberg.xavier.servicio.DepartamentoServicioLocal;
import co.edu.javeriana.konigsberg.xavier.servicio.PaisServicioLocal;
import co.edu.javeriana.konigsberg.xavier.servicio.SeguridadServicioLocal;

@ManagedBean(name="seguridadBean")
@SessionScoped
public class SeguridadBean extends ManagerBean{
	private static final long serialVersionUID = 1L;
	private String nombreUsuario;
	private String clave;
	private Boolean autenticado;
	private UsuarioDTO usuarioDTO = new UsuarioDTO();
	@EJB
	private SeguridadServicioLocal seguridadServicio;
	
	@EJB
	private CiudadServicioLocal ciudadServicioLocal;
	
	@EJB
	private DepartamentoServicioLocal departamentoServicioLocal;
	
	@EJB
	private PaisServicioLocal paisServicioLocal;
	
	@PostConstruct
	public void init(){
		
	}
	
	public String login() {
		String nextPage = null;
		seguridadServicio.autenticar(usuarioDTO);
		if(usuarioDTO.getPerfil() != null){
			cargarEnSession("usuario", usuarioDTO);
			autenticado = true;
			RequestContext context = RequestContext.getCurrentInstance();
			context.addCallbackParam("estaLogeado", autenticado);
			nextPage = "inicio";
			
			
			List<PaisDTO> paisDTOs = paisServicioLocal.obtenerLista();
			for (PaisDTO paisDTO : paisDTOs) {
				List<DepartamentoDTO> deptos = departamentoServicioLocal.obtenerListaDePadre(paisDTO);
				for (DepartamentoDTO departamentoDTO : deptos) {
					ciudadServicioLocal.obtenerListaDePadre(departamentoDTO);
				}
			}
			
		}else{
			addMessageError("Usuario o clave errada");
			autenticado = false;
			nextPage = "login";
		}
		
		return nextPage;
	}
	
	public String simulador(){
		
		return irAPagina("simulador");
	}
	
	public String cerrarSesion() {
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
		session.invalidate();
		autenticado = false;
		return "login";
	} 
	
	public String inicio() {
		return irAPagina("inicio");
	}
	
	public String crearPrograma(){
		cargarEnSession("programa", null);
		cargarEnSession("departamentosSeleccionados", null);
		return irAPagina("programa");
	}
	public String crearEmpresa(){
		return irAPagina("empresa");
	}
	public String crearConferencista(){
		return irAPagina("conferencista");
	}
	
	private String irAPagina(String pagina) {
		return estaAutenticado() ? pagina : "login";
	}
	
	public boolean estaAutenticado(){
		return obtenerEnSession("usuario") != null;
	}
	public String getNombreUsuario() {
		return nombreUsuario;
	}

	public void setNombreUsuario(String nombreUsuario) {
		this.nombreUsuario = nombreUsuario;
	}

	public String getClave() {
		return clave;
	}

	public void setClave(String clave) {
		this.clave = clave;
	}

	public Boolean getAutenticado() {
		return autenticado;
	}

	public void setAutenticado(Boolean autenticado) {
		this.autenticado = autenticado;
	}
	public UsuarioDTO getUsuarioDTO() {
		return usuarioDTO;
	}
	public void setUsuarioDTO(UsuarioDTO usuarioDTO) {
		this.usuarioDTO = usuarioDTO;
	}
	public String getNombreUsuarioAutenticado(){
		UsuarioDTO usuarioDTO = obtenerUsuario();
		return usuarioDTO == null ? null : usuarioDTO.getNombre();
	}
	public String getPerfilUsuarioAutenticado(){
		UsuarioDTO usuarioDTO = obtenerUsuario();
		return usuarioDTO == null ? null : usuarioDTO.getPerfil();
	}
}
